package org.example;

import java.util.ArrayList;
import java.util.List;

// 同型AST节点类型
public class AST {
    Token token;
    List<AST> children; // 规范化子节点列表

    // 创建作为根节点的空节点
    public AST() {
    }

    public AST(Token token) {
        this.token = token;
    }

    // 根据词法单元类型创建节点，主要用于虚节点
    public AST(int tokenType) {
        this.token = new Token(tokenType);
    }

    // 对于同一类型的节点，外部访问者会执行同样的代码
    public int getNodeType() {
        return token.type;
    }

    public void addChild(AST t) {
        if (children == null) {
            children = new ArrayList<>();
        }

        children.add(t);
    }

    public boolean isNil() {
        return token == null;
    }


    // 生成单个节点的文本形式
    @Override
    public String toString() {
        return token != null ? token.toString() : "nil";
    }

    // 生成整个树而不是某个节点的文本形式
    public String toStringTree() {
        if (children == null) return toString();

        StringBuilder buf = new StringBuilder();

        if (!isNil()) {
            buf.append("(");
            buf.append(this);
            buf.append(' ');
        }

        for (var i = 0; i < children.size(); i++) {
            var t = children.get(i);
            if (i > 0) {
                buf.append(' ');
            }
            buf.append(t.toStringTree());
        }

        if (!isNil()) {
            buf.append(")");
        }

        return buf.toString();
    }

}
